/*
 * Token.h
 * Union管理类
 *  Created on: 2020年12月18日
 *      Author: san
 */

#ifndef TOKEN_H_
#define TOKEN_H_

#include <string>

#include "Sales_data.h"

using std::string;

namespace san {

class Token {
public:
	// 构造函数和析构函数
	Token(): tok(INT), ival(0) {};
	Token(const int &i): tok(INT) ,ival(i) {}
	Token(const char &c): tok(CHAR), cval(c)  {}
	Token(const std::string &s):tok(STR) { new (&sval) std::string(s); }
	Token(const Sales_data &item):tok(SD) { new (&sd) Sales_data(item); }
	Token(const Token &t): tok(t.tok) { copyUnion(t); }
	// 移动构造函数
	Token(Sales_data && item): tok(SD) { std::cout << "Token(Sales_data && item)" << std::endl; sd = std::move(item); }
	Token(Token &&t);
	~Token();

	// 拷贝赋值
	Token &operator =(const Token &);
	Token &operator =(const int &);
	Token &operator =(const char &);
	Token &operator =(const std::string &);
	// 移动拷贝
	Token &operator =(Token &&);  // 只定义这一个了

private:
	enum {INT, CHAR, STR, SD} tok;  // 判别式
	union {
		char cval;
		int ival;
		std::string sval;
		Sales_data sd;
	};
	void copyUnion(const Token &);
};

} /* namespace san */

#endif /* TOKEN_H_ */
